In [1]:
from query import *
import panel as pn
import geoviews as gv
import geoviews.feature as gf
import plotly.express as px
import geopandas as gpd
from shapely.geometry import Polygon

gv.extension("bokeh")

VARIABLE = "2m_temperature"
MIN_LAT = 55
MAX_LAT = 85
MIN_LON = -75
MAX_LON = -10
START_DATETIME = "2023-01-01 00:00:00"
END_DATETIME = "2023-01-03 09:00:00"
No description has been provided for this image No description has been provided for this image

1. Single Value Aggregation¶

Get a single aggregation min/max/average value in the certain spatial area during a certain period of time

E.g., get the average temperature in the box area during the period of time.

In [2]:
single_value_aggregation_query(
    variable=VARIABLE, 
    min_lat=MIN_LAT, 
    max_lat=MAX_LAT, 
    min_lon=MIN_LON, 
    max_lon=MAX_LON, 
    start_datetime=START_DATETIME, 
    end_datetime=END_DATETIME, 
    aggregation_method="mean"
)
Out[2]:
<xarray.Dataset> Size: 4B
Dimensions:  ()
Data variables:
    t2m      float32 4B 256.2
xarray.Dataset
      • t2m
        ()
        float32
        256.2
        array(256.23087, dtype=float32)

      2. Time series query¶

      Get the time series for a variable's aggregation value in a certain spatial area during a certain period of time

      E.g., get the daily average temperature in the box area during the period of time.

      In [3]:
      ts = time_series_query(
          variable=VARIABLE, 
          min_lat=MIN_LAT,
          max_lat=MAX_LAT,
          min_lon=MIN_LON,
          max_lon=MAX_LON,
          start_datetime=START_DATETIME,
          end_datetime=END_DATETIME,
          time_resolution="day",
          aggregation_method="mean"
      )
      ts
      
      Out[3]:
      <xarray.Dataset> Size: 36B
      Dimensions:  (time: 3)
      Coordinates:
        * time     (time) datetime64[ns] 24B 2023-01-01 2023-01-02 2023-01-03
      Data variables:
          t2m      (time) float32 12B 255.3 256.7 257.2
      xarray.Dataset
        • time: 3
        • time
          (time)
          datetime64[ns]
          2023-01-01 2023-01-02 2023-01-03
          long_name :
          time
          array(['2023-01-01T00:00:00.000000000', '2023-01-02T00:00:00.000000000',
                 '2023-01-03T00:00:00.000000000'], dtype='datetime64[ns]')
        • t2m
          (time)
          float32
          255.3 256.7 257.2
          array([255.31847, 256.73544, 257.2094 ], dtype=float32)
        • time
          PandasIndex
          PandasIndex(DatetimeIndex(['2023-01-01', '2023-01-02', '2023-01-03'], dtype='datetime64[ns]', name='time', freq='D'))

      2.1 visualize time series¶

      In [4]:
      ts['t2m'].plot()
      
      Out[4]:
      [<matplotlib.lines.Line2D at 0x12f5c3c50>]
      No description has been provided for this image

      3. Heatmap query (single layer)¶

      Get a single-layer, aggregated heatmap of a variable at a certain spatial area in a certain period of time

      E.g., get a heatmap for max temperature for the box area during the period of time

      In [5]:
      hm = heat_map_query_single_layer(
          variable=VARIABLE, 
          min_lat=MIN_LAT,
          max_lat=MAX_LAT,
          min_lon=MIN_LON,
          max_lon=MAX_LON,
          start_datetime=START_DATETIME,
          end_datetime=END_DATETIME,
          spatial_resolution=0.5,
          spatial_agg_method="max",
      )
      
      hm
      
      Out[5]:
      <xarray.Dataset> Size: 32kB
      Dimensions:    (latitude: 60, longitude: 130)
      Coordinates:
        * longitude  (longitude) float32 520B -74.88 -74.38 -73.88 ... -10.88 -10.38
        * latitude   (latitude) float32 240B 84.88 84.38 83.88 ... 56.38 55.88 55.38
      Data variables:
          t2m        (latitude, longitude) float32 31kB 250.2 250.3 ... 281.1 281.1
      xarray.Dataset
        • latitude: 60
        • longitude: 130
        • longitude
          (longitude)
          float32
          -74.88 -74.38 ... -10.88 -10.38
          units :
          degrees_east
          long_name :
          longitude
          array([-74.875, -74.375, -73.875, -73.375, -72.875, -72.375, -71.875, -71.375,
                 -70.875, -70.375, -69.875, -69.375, -68.875, -68.375, -67.875, -67.375,
                 -66.875, -66.375, -65.875, -65.375, -64.875, -64.375, -63.875, -63.375,
                 -62.875, -62.375, -61.875, -61.375, -60.875, -60.375, -59.875, -59.375,
                 -58.875, -58.375, -57.875, -57.375, -56.875, -56.375, -55.875, -55.375,
                 -54.875, -54.375, -53.875, -53.375, -52.875, -52.375, -51.875, -51.375,
                 -50.875, -50.375, -49.875, -49.375, -48.875, -48.375, -47.875, -47.375,
                 -46.875, -46.375, -45.875, -45.375, -44.875, -44.375, -43.875, -43.375,
                 -42.875, -42.375, -41.875, -41.375, -40.875, -40.375, -39.875, -39.375,
                 -38.875, -38.375, -37.875, -37.375, -36.875, -36.375, -35.875, -35.375,
                 -34.875, -34.375, -33.875, -33.375, -32.875, -32.375, -31.875, -31.375,
                 -30.875, -30.375, -29.875, -29.375, -28.875, -28.375, -27.875, -27.375,
                 -26.875, -26.375, -25.875, -25.375, -24.875, -24.375, -23.875, -23.375,
                 -22.875, -22.375, -21.875, -21.375, -20.875, -20.375, -19.875, -19.375,
                 -18.875, -18.375, -17.875, -17.375, -16.875, -16.375, -15.875, -15.375,
                 -14.875, -14.375, -13.875, -13.375, -12.875, -12.375, -11.875, -11.375,
                 -10.875, -10.375], dtype=float32)
        • latitude
          (latitude)
          float32
          84.88 84.38 83.88 ... 55.88 55.38
          units :
          degrees_north
          long_name :
          latitude
          array([84.875, 84.375, 83.875, 83.375, 82.875, 82.375, 81.875, 81.375, 80.875,
                 80.375, 79.875, 79.375, 78.875, 78.375, 77.875, 77.375, 76.875, 76.375,
                 75.875, 75.375, 74.875, 74.375, 73.875, 73.375, 72.875, 72.375, 71.875,
                 71.375, 70.875, 70.375, 69.875, 69.375, 68.875, 68.375, 67.875, 67.375,
                 66.875, 66.375, 65.875, 65.375, 64.875, 64.375, 63.875, 63.375, 62.875,
                 62.375, 61.875, 61.375, 60.875, 60.375, 59.875, 59.375, 58.875, 58.375,
                 57.875, 57.375, 56.875, 56.375, 55.875, 55.375], dtype=float32)
        • t2m
          (latitude, longitude)
          float32
          250.2 250.3 250.4 ... 281.1 281.1
          array([[250.17697, 250.27184, 250.367  , ..., 260.68616, 260.74225,
                  260.7986 ],
                 [250.84753, 250.92233, 250.98148, ..., 261.12506, 261.20462,
                  261.28055],
                 [251.02914, 251.04779, 251.0618 , ..., 261.57025, 261.67264,
                  261.78403],
                 ...,
                 [260.8661 , 260.6121 , 260.1378 , ..., 280.83292, 280.87805,
                  280.81854],
                 [260.3854 , 260.23468, 260.1074 , ..., 281.07202, 281.0443 ,
                  280.96924],
                 [259.83875, 259.69577, 259.7054 , ..., 281.10095, 281.10242,
                  281.05124]], dtype=float32)
        • longitude
          PandasIndex
          PandasIndex(Index([-74.875, -74.375, -73.875, -73.375, -72.875, -72.375, -71.875, -71.375,
                 -70.875, -70.375,
                 ...
                 -14.875, -14.375, -13.875, -13.375, -12.875, -12.375, -11.875, -11.375,
                 -10.875, -10.375],
                dtype='float32', name='longitude', length=130))
        • latitude
          PandasIndex
          PandasIndex(Index([84.875, 84.375, 83.875, 83.375, 82.875, 82.375, 81.875, 81.375, 80.875,
                 80.375, 79.875, 79.375, 78.875, 78.375, 77.875, 77.375, 76.875, 76.375,
                 75.875, 75.375, 74.875, 74.375, 73.875, 73.375, 72.875, 72.375, 71.875,
                 71.375, 70.875, 70.375, 69.875, 69.375, 68.875, 68.375, 67.875, 67.375,
                 66.875, 66.375, 65.875, 65.375, 64.875, 64.375, 63.875, 63.375, 62.875,
                 62.375, 61.875, 61.375, 60.875, 60.375, 59.875, 59.375, 58.875, 58.375,
                 57.875, 57.375, 56.875, 56.375, 55.875, 55.375],
                dtype='float32', name='latitude'))

      3.1 visualize single-layer heatmap¶

      In [6]:
      hm['t2m'].plot(cmap="coolwarm")
      
      Out[6]:
      <matplotlib.collections.QuadMesh at 0x12f62ffd0>
      No description has been provided for this image

      4. Heatmap query (multi layer)¶

      Get a multi-layer heatmap of a variable at a certain spatial area in a certain period of time

      Each layer represents a time during the period of time.

      AKA. get a raster cube of a variable at a certain spatial area and spatial resolution, in a certain period of time and temporal resolution.

      E.g., get raster cude of temperature in the box area (at 2degree * 2degree resolution) during the period of time (at daily resolution)

      In [7]:
      hmm = heat_map_query_multi_layer(
          variable=VARIABLE,
          min_lat=MIN_LAT,
          max_lat=MAX_LAT,
          min_lon=MIN_LON,
          max_lon=MAX_LON,
          start_datetime=START_DATETIME,
          end_datetime=END_DATETIME,
          spatial_resolution=2,
          spatial_agg_method="mean",
          time_resolution="day",
          time_agg_method="mean",
      )
      
      hmm
      
      Out[7]:
      <xarray.Dataset> Size: 6kB
      Dimensions:    (time: 3, latitude: 15, longitude: 32)
      Coordinates:
        * longitude  (longitude) float32 128B -74.12 -72.12 -70.12 ... -14.12 -12.12
        * latitude   (latitude) float32 60B 84.12 82.12 80.12 ... 60.12 58.12 56.12
        * time       (time) datetime64[ns] 24B 2023-01-01 2023-01-02 2023-01-03
      Data variables:
          t2m        (time, latitude, longitude) float32 6kB 249.4 249.4 ... 282.4
      Attributes:
          Conventions:  CF-1.6
          history:      2024-04-10 18:52:20 GMT by grib_to_netcdf-2.25.1: /opt/ecmw...
      xarray.Dataset
        • time: 3
        • latitude: 15
        • longitude: 32
        • longitude
          (longitude)
          float32
          -74.12 -72.12 ... -14.12 -12.12
          units :
          degrees_east
          long_name :
          longitude
          array([-74.125, -72.125, -70.125, -68.125, -66.125, -64.125, -62.125, -60.125,
                 -58.125, -56.125, -54.125, -52.125, -50.125, -48.125, -46.125, -44.125,
                 -42.125, -40.125, -38.125, -36.125, -34.125, -32.125, -30.125, -28.125,
                 -26.125, -24.125, -22.125, -20.125, -18.125, -16.125, -14.125, -12.125],
                dtype=float32)
        • latitude
          (latitude)
          float32
          84.12 82.12 80.12 ... 58.12 56.12
          units :
          degrees_north
          long_name :
          latitude
          array([84.125, 82.125, 80.125, 78.125, 76.125, 74.125, 72.125, 70.125, 68.125,
                 66.125, 64.125, 62.125, 60.125, 58.125, 56.125], dtype=float32)
        • time
          (time)
          datetime64[ns]
          2023-01-01 2023-01-02 2023-01-03
          long_name :
          time
          array(['2023-01-01T00:00:00.000000000', '2023-01-02T00:00:00.000000000',
                 '2023-01-03T00:00:00.000000000'], dtype='datetime64[ns]')
        • t2m
          (time, latitude, longitude)
          float32
          249.4 249.4 249.5 ... 282.1 282.4
          units :
          K
          long_name :
          2 metre temperature
          array([[[249.40498, 249.38995, 249.47237, ..., 259.49365, 260.10245,
                   260.44614],
                  [243.70172, 244.05293, 243.35936, ..., 256.4925 , 258.22922,
                   260.09207],
                  [245.02702, 247.65184, 249.41235, ..., 257.3466 , 259.24817,
                   261.56836],
                  ...,
                  [253.51811, 251.40187, 255.29811, ..., 277.38635, 278.09518,
                   278.5336 ],
                  [259.9087 , 259.65967, 260.53036, ..., 278.32156, 278.42252,
                   278.69217],
                  [261.27493, 260.32034, 260.17657, ..., 278.8229 , 279.16107,
                   279.5205 ]],
          
                 [[250.23352, 250.17915, 250.14552, ..., 260.68683, 261.2026 ,
                   261.62756],
                  [250.77065, 249.86456, 247.5332 , ..., 258.8894 , 260.35046,
                   262.37918],
                  [250.15355, 253.17761, 254.51814, ..., 259.5195 , 261.3447 ,
                   263.36264],
          ...
                  [257.86307, 257.00732, 257.9446 , ..., 279.83444, 279.9784 ,
                   279.87277],
                  [261.17062, 260.90073, 260.61172, ..., 280.8836 , 280.7077 ,
                   280.7051 ],
                  [259.6863 , 259.28152, 258.78482, ..., 281.56952, 281.38168,
                   281.2772 ]],
          
                 [[252.57608, 252.68633, 252.83061, ..., 260.46985, 260.81384,
                   261.28662],
                  [252.38933, 251.59126, 249.0647 , ..., 259.28217, 260.35236,
                   262.0983 ],
                  [252.48369, 254.68938, 255.30424, ..., 260.67014, 262.29242,
                   263.45242],
                  ...,
                  [256.81198, 255.22746, 256.42123, ..., 281.0589 , 281.6155 ,
                   281.51227],
                  [258.45294, 258.67502, 259.1806 , ..., 281.54428, 281.7079 ,
                   281.83078],
                  [257.93503, 258.5224 , 258.9948 , ..., 282.04266, 282.11603,
                   282.36368]]], dtype=float32)
        • longitude
          PandasIndex
          PandasIndex(Index([-74.125, -72.125, -70.125, -68.125, -66.125, -64.125, -62.125, -60.125,
                 -58.125, -56.125, -54.125, -52.125, -50.125, -48.125, -46.125, -44.125,
                 -42.125, -40.125, -38.125, -36.125, -34.125, -32.125, -30.125, -28.125,
                 -26.125, -24.125, -22.125, -20.125, -18.125, -16.125, -14.125, -12.125],
                dtype='float32', name='longitude'))
        • latitude
          PandasIndex
          PandasIndex(Index([84.125, 82.125, 80.125, 78.125, 76.125, 74.125, 72.125, 70.125, 68.125,
                 66.125, 64.125, 62.125, 60.125, 58.125, 56.125],
                dtype='float32', name='latitude'))
        • time
          PandasIndex
          PandasIndex(DatetimeIndex(['2023-01-01', '2023-01-02', '2023-01-03'], dtype='datetime64[ns]', name='time', freq='D'))
      • Conventions :
        CF-1.6
        history :
        2024-04-10 18:52:20 GMT by grib_to_netcdf-2.25.1: /opt/ecmwf/mars-client/bin/grib_to_netcdf.bin -S param -o /cache/data1/adaptor.mars.internal-1712775139.728601-23944-12-bdaa8304-b7e7-4c83-8391-944334f99b6e.nc /cache/tmp/bdaa8304-b7e7-4c83-8391-944334f99b6e-adaptor.mars.internal-1712775136.3671-23944-21-tmp.grib

      4.1 visualize multi-layer heatmap¶

      In [8]:
      gv_dataset = gv.Dataset(hmm)
      gv_dataset.to(gv.Image)
      gv_image = gv_dataset.to(gv.Image)
      gv_image.opts(cmap="coolwarm", colorbar=True, tools=["hover"])
      gv_image = gv_image * gf.coastline
      gv_image.opts(width=700, height=500)
      # pn.panel(gv_image, width=700, height=500).servable()
      
      Out[8]:

      5. Value criteria query¶

      Get a raster cube where each cell satisfies the value criteria

      E.g., get raster cube in the box area (at 2degree * 2degree resolution) during the period of time (at daily resolution), where the daily max temperature is > 255

      In [9]:
      vc = value_criteria_query(
          variable=VARIABLE,
          min_lat=MIN_LAT,
          max_lat=MAX_LAT,
          min_lon=MIN_LON,
          max_lon=MAX_LON,
          start_datetime=START_DATETIME,
          end_datetime=END_DATETIME,
          spatial_resolution=2,
          spatial_agg_method="max",
          time_resolution="day",
          time_agg_method="max",
          criteria_predicate="<",
          criteria_value=255
      )
      
      vc
      
      Out[9]:
      <xarray.Dataset> Size: 6kB
      Dimensions:    (time: 3, latitude: 15, longitude: 32)
      Coordinates:
        * longitude  (longitude) float32 128B -74.12 -72.12 -70.12 ... -14.12 -12.12
        * latitude   (latitude) float32 60B 84.12 82.12 80.12 ... 60.12 58.12 56.12
        * time       (time) datetime64[ns] 24B 2023-01-01 2023-01-02 2023-01-03
      Data variables:
          t2m        (time, latitude, longitude) float32 6kB 251.2 251.3 ... nan nan
      Attributes:
          Conventions:  CF-1.6
          history:      2024-04-10 18:52:20 GMT by grib_to_netcdf-2.25.1: /opt/ecmw...
      xarray.Dataset
        • time: 3
        • latitude: 15
        • longitude: 32
        • longitude
          (longitude)
          float32
          -74.12 -72.12 ... -14.12 -12.12
          units :
          degrees_east
          long_name :
          longitude
          array([-74.125, -72.125, -70.125, -68.125, -66.125, -64.125, -62.125, -60.125,
                 -58.125, -56.125, -54.125, -52.125, -50.125, -48.125, -46.125, -44.125,
                 -42.125, -40.125, -38.125, -36.125, -34.125, -32.125, -30.125, -28.125,
                 -26.125, -24.125, -22.125, -20.125, -18.125, -16.125, -14.125, -12.125],
                dtype=float32)
        • latitude
          (latitude)
          float32
          84.12 82.12 80.12 ... 58.12 56.12
          units :
          degrees_north
          long_name :
          latitude
          array([84.125, 82.125, 80.125, 78.125, 76.125, 74.125, 72.125, 70.125, 68.125,
                 66.125, 64.125, 62.125, 60.125, 58.125, 56.125], dtype=float32)
        • time
          (time)
          datetime64[ns]
          2023-01-01 2023-01-02 2023-01-03
          long_name :
          time
          array(['2023-01-01T00:00:00.000000000', '2023-01-02T00:00:00.000000000',
                 '2023-01-03T00:00:00.000000000'], dtype='datetime64[ns]')
        • t2m
          (time, latitude, longitude)
          float32
          251.2 251.3 251.4 ... nan nan nan
          units :
          K
          long_name :
          2 metre temperature
          array([[[251.22891, 251.29869, 251.40335, ...,       nan,       nan,
                         nan],
                  [254.48108, 254.14888, 253.39651, ...,       nan,       nan,
                         nan],
                  [251.10605,       nan,       nan, ...,       nan,       nan,
                         nan],
                  ...,
                  [      nan,       nan,       nan, ...,       nan,       nan,
                         nan],
                  [      nan,       nan,       nan, ...,       nan,       nan,
                         nan],
                  [      nan,       nan,       nan, ...,       nan,       nan,
                         nan]],
          
                 [[252.6253 , 252.51997, 252.39021, ...,       nan,       nan,
                         nan],
                  [      nan,       nan,       nan, ...,       nan,       nan,
                         nan],
                  [      nan,       nan,       nan, ...,       nan,       nan,
                         nan],
          ...
                  [      nan,       nan,       nan, ...,       nan,       nan,
                         nan],
                  [      nan,       nan,       nan, ...,       nan,       nan,
                         nan],
                  [      nan,       nan,       nan, ...,       nan,       nan,
                         nan]],
          
                 [[254.79   , 254.74449,       nan, ...,       nan,       nan,
                         nan],
                  [      nan,       nan,       nan, ...,       nan,       nan,
                         nan],
                  [      nan,       nan,       nan, ...,       nan,       nan,
                         nan],
                  ...,
                  [      nan,       nan,       nan, ...,       nan,       nan,
                         nan],
                  [      nan,       nan,       nan, ...,       nan,       nan,
                         nan],
                  [      nan,       nan,       nan, ...,       nan,       nan,
                         nan]]], dtype=float32)
        • longitude
          PandasIndex
          PandasIndex(Index([-74.125, -72.125, -70.125, -68.125, -66.125, -64.125, -62.125, -60.125,
                 -58.125, -56.125, -54.125, -52.125, -50.125, -48.125, -46.125, -44.125,
                 -42.125, -40.125, -38.125, -36.125, -34.125, -32.125, -30.125, -28.125,
                 -26.125, -24.125, -22.125, -20.125, -18.125, -16.125, -14.125, -12.125],
                dtype='float32', name='longitude'))
        • latitude
          PandasIndex
          PandasIndex(Index([84.125, 82.125, 80.125, 78.125, 76.125, 74.125, 72.125, 70.125, 68.125,
                 66.125, 64.125, 62.125, 60.125, 58.125, 56.125],
                dtype='float32', name='latitude'))
        • time
          PandasIndex
          PandasIndex(DatetimeIndex(['2023-01-01', '2023-01-02', '2023-01-03'], dtype='datetime64[ns]', name='time', freq='D'))
      • Conventions :
        CF-1.6
        history :
        2024-04-10 18:52:20 GMT by grib_to_netcdf-2.25.1: /opt/ecmwf/mars-client/bin/grib_to_netcdf.bin -S param -o /cache/data1/adaptor.mars.internal-1712775139.728601-23944-12-bdaa8304-b7e7-4c83-8391-944334f99b6e.nc /cache/tmp/bdaa8304-b7e7-4c83-8391-944334f99b6e-adaptor.mars.internal-1712775136.3671-23944-21-tmp.grib

      5.1 visualize value criteria result¶

      In [10]:
      gv_dataset = gv.Dataset(vc)
      gv_dataset.to(gv.Image)
      gv_image = gv_dataset.to(gv.Image)
      gv_image.opts(cmap="coolwarm", colorbar=True, tools=["hover"])
      gv_image = gv_image * gf.coastline
      gv_image.opts(width=700, height=500)
      # pn.panel(gv_image, width=700, height=500).servable()
      
      Out[10]:

      6. Area finding query¶

      Find spatial area that satisfies a certain criteria.

      E.g., find area in the box area where every daily max temperature is < 255

      In [11]:
      af = area_finding_query(
          variable=VARIABLE,
          min_lat=MIN_LAT,
          max_lat=MAX_LAT,
          min_lon=MIN_LON,
          max_lon=MAX_LON,
          start_datetime=START_DATETIME,
          end_datetime=END_DATETIME,
          spatial_resolution=2,
          spatial_agg_method="max",
          time_resolution="day",
          time_agg_method="max",
          criteria_predicate="<",
          criteria_value=255,
          any_or_all="all"
      )
      af
      
      Out[11]:
      <xarray.Dataset> Size: 6kB
      Dimensions:       (time: 3, latitude: 15, longitude: 32)
      Coordinates:
        * longitude     (longitude) float32 128B -74.12 -72.12 ... -14.12 -12.12
        * latitude      (latitude) float32 60B 84.12 82.12 80.12 ... 60.12 58.12 56.12
        * time          (time) datetime64[ns] 24B 2023-01-01 2023-01-02 2023-01-03
      Data variables:
          t2m           (time, latitude, longitude) float32 6kB 251.2 251.3 ... nan
          spatial_mask  (latitude, longitude) bool 480B True True ... False False
      Attributes:
          Conventions:  CF-1.6
          history:      2024-04-10 18:52:20 GMT by grib_to_netcdf-2.25.1: /opt/ecmw...
      xarray.Dataset
        • time: 3
        • latitude: 15
        • longitude: 32
        • longitude
          (longitude)
          float32
          -74.12 -72.12 ... -14.12 -12.12
          units :
          degrees_east
          long_name :
          longitude
          array([-74.125, -72.125, -70.125, -68.125, -66.125, -64.125, -62.125, -60.125,
                 -58.125, -56.125, -54.125, -52.125, -50.125, -48.125, -46.125, -44.125,
                 -42.125, -40.125, -38.125, -36.125, -34.125, -32.125, -30.125, -28.125,
                 -26.125, -24.125, -22.125, -20.125, -18.125, -16.125, -14.125, -12.125],
                dtype=float32)
        • latitude
          (latitude)
          float32
          84.12 82.12 80.12 ... 58.12 56.12
          units :
          degrees_north
          long_name :
          latitude
          array([84.125, 82.125, 80.125, 78.125, 76.125, 74.125, 72.125, 70.125, 68.125,
                 66.125, 64.125, 62.125, 60.125, 58.125, 56.125], dtype=float32)
        • time
          (time)
          datetime64[ns]
          2023-01-01 2023-01-02 2023-01-03
          long_name :
          time
          array(['2023-01-01T00:00:00.000000000', '2023-01-02T00:00:00.000000000',
                 '2023-01-03T00:00:00.000000000'], dtype='datetime64[ns]')
        • t2m
          (time, latitude, longitude)
          float32
          251.2 251.3 251.4 ... nan nan nan
          units :
          K
          long_name :
          2 metre temperature
          array([[[251.22891, 251.29869, 251.40335, ...,       nan,       nan,
                         nan],
                  [254.48108, 254.14888, 253.39651, ...,       nan,       nan,
                         nan],
                  [251.10605,       nan,       nan, ...,       nan,       nan,
                         nan],
                  ...,
                  [      nan,       nan,       nan, ...,       nan,       nan,
                         nan],
                  [      nan,       nan,       nan, ...,       nan,       nan,
                         nan],
                  [      nan,       nan,       nan, ...,       nan,       nan,
                         nan]],
          
                 [[252.6253 , 252.51997, 252.39021, ...,       nan,       nan,
                         nan],
                  [      nan,       nan,       nan, ...,       nan,       nan,
                         nan],
                  [      nan,       nan,       nan, ...,       nan,       nan,
                         nan],
          ...
                  [      nan,       nan,       nan, ...,       nan,       nan,
                         nan],
                  [      nan,       nan,       nan, ...,       nan,       nan,
                         nan],
                  [      nan,       nan,       nan, ...,       nan,       nan,
                         nan]],
          
                 [[254.79   , 254.74449,       nan, ...,       nan,       nan,
                         nan],
                  [      nan,       nan,       nan, ...,       nan,       nan,
                         nan],
                  [      nan,       nan,       nan, ...,       nan,       nan,
                         nan],
                  ...,
                  [      nan,       nan,       nan, ...,       nan,       nan,
                         nan],
                  [      nan,       nan,       nan, ...,       nan,       nan,
                         nan],
                  [      nan,       nan,       nan, ...,       nan,       nan,
                         nan]]], dtype=float32)
        • spatial_mask
          (latitude, longitude)
          bool
          True True False ... False False
          array([[ True,  True, False, False, False, False, False, False, False,
                  False, False, False, False, False, False, False, False, False,
                  False, False, False, False, False, False, False, False, False,
                  False, False, False, False, False],
                 [False, False, False,  True,  True,  True,  True,  True,  True,
                   True,  True,  True,  True,  True,  True,  True,  True,  True,
                   True,  True,  True,  True, False, False, False, False, False,
                  False, False, False, False, False],
                 [False, False, False, False, False, False, False, False, False,
                   True,  True,  True,  True,  True,  True,  True,  True,  True,
                   True,  True,  True,  True,  True, False, False, False, False,
                  False, False, False, False, False],
                 [False, False, False, False, False, False, False,  True,  True,
                   True,  True,  True,  True,  True,  True,  True,  True,  True,
                   True,  True,  True,  True,  True,  True, False, False, False,
                  False, False, False, False, False],
                 [False, False, False, False, False, False, False, False, False,
                  False, False,  True,  True,  True,  True,  True,  True,  True,
                   True,  True,  True,  True,  True,  True, False, False, False,
                  False, False, False, False, False],
          ...
                 [False, False,  True, False,  True, False, False, False, False,
                  False, False, False, False,  True,  True,  True, False, False,
                  False, False, False, False, False, False, False, False, False,
                  False, False, False, False, False],
                 [False, False, False, False, False, False, False, False, False,
                  False, False, False, False, False, False, False, False, False,
                  False, False, False, False, False, False, False, False, False,
                  False, False, False, False, False],
                 [False, False, False, False, False, False, False, False, False,
                  False, False, False, False, False, False, False, False, False,
                  False, False, False, False, False, False, False, False, False,
                  False, False, False, False, False],
                 [False, False, False, False, False, False, False, False, False,
                  False, False, False, False, False, False, False, False, False,
                  False, False, False, False, False, False, False, False, False,
                  False, False, False, False, False],
                 [False, False, False, False, False, False, False, False, False,
                  False, False, False, False, False, False, False, False, False,
                  False, False, False, False, False, False, False, False, False,
                  False, False, False, False, False]])
        • longitude
          PandasIndex
          PandasIndex(Index([-74.125, -72.125, -70.125, -68.125, -66.125, -64.125, -62.125, -60.125,
                 -58.125, -56.125, -54.125, -52.125, -50.125, -48.125, -46.125, -44.125,
                 -42.125, -40.125, -38.125, -36.125, -34.125, -32.125, -30.125, -28.125,
                 -26.125, -24.125, -22.125, -20.125, -18.125, -16.125, -14.125, -12.125],
                dtype='float32', name='longitude'))
        • latitude
          PandasIndex
          PandasIndex(Index([84.125, 82.125, 80.125, 78.125, 76.125, 74.125, 72.125, 70.125, 68.125,
                 66.125, 64.125, 62.125, 60.125, 58.125, 56.125],
                dtype='float32', name='latitude'))
        • time
          PandasIndex
          PandasIndex(DatetimeIndex(['2023-01-01', '2023-01-02', '2023-01-03'], dtype='datetime64[ns]', name='time', freq='D'))
      • Conventions :
        CF-1.6
        history :
        2024-04-10 18:52:20 GMT by grib_to_netcdf-2.25.1: /opt/ecmwf/mars-client/bin/grib_to_netcdf.bin -S param -o /cache/data1/adaptor.mars.internal-1712775139.728601-23944-12-bdaa8304-b7e7-4c83-8391-944334f99b6e.nc /cache/tmp/bdaa8304-b7e7-4c83-8391-944334f99b6e-adaptor.mars.internal-1712775136.3671-23944-21-tmp.grib

      6.1 visualize area finding¶

      In [12]:
      df = af["spatial_mask"].to_dataframe().reset_index()
      df["latitude"] = df["latitude"] - 1
      df["longitude"] = df["longitude"] - 1
      df["latitude2"] = df["latitude"] + 2
      df["longitude2"] = df["longitude"] + 2
      gdf = gpd.GeoDataFrame(df, geometry=[Polygon([(x, y), (x, y2), (x2, y2), (x2, y)]) for x, y, x2, y2 in zip(df["longitude"], df["latitude"], df["longitude2"], df["latitude2"])])
      
      
      fig = px.choropleth_mapbox(
          gdf,
          geojson=gdf.geometry,
          locations=gdf.index,
          color="spatial_mask",
          mapbox_style="carto-positron",
          center={"lat": gdf["latitude"].mean(), "lon": gdf["longitude"].mean()},
          zoom=1,
      )
      fig.show()
      

      7. Time period query¶

      Find time period that satisfies a certain criteria

      E.g., find days during the time period in the box area where all daily max temperature is < 282

      In [13]:
      tp = time_period_query(
          variable=VARIABLE,
          min_lat=MIN_LAT,
          max_lat=MAX_LAT,
          min_lon=MIN_LON,
          max_lon=MAX_LON,
          start_datetime=START_DATETIME,
          end_datetime=END_DATETIME,
          spatial_resolution=2,
          spatial_agg_method="max",
          time_resolution="day",
          time_agg_method="max",
          criteria_predicate="<",
          criteria_value=282,
          any_or_all="all"
      )
      
      tp
      
      Out[13]:
      <xarray.Dataset> Size: 6kB
      Dimensions:    (time: 3, latitude: 15, longitude: 32)
      Coordinates:
        * longitude  (longitude) float32 128B -74.12 -72.12 -70.12 ... -14.12 -12.12
        * latitude   (latitude) float32 60B 84.12 82.12 80.12 ... 60.12 58.12 56.12
        * time       (time) datetime64[ns] 24B 2023-01-01 2023-01-02 2023-01-03
      Data variables:
          t2m        (time, latitude, longitude) float32 6kB 251.2 251.3 ... nan nan
          time_mask  (time) bool 3B True False False
      Attributes:
          Conventions:  CF-1.6
          history:      2024-04-10 18:52:20 GMT by grib_to_netcdf-2.25.1: /opt/ecmw...
      xarray.Dataset
        • time: 3
        • latitude: 15
        • longitude: 32
        • longitude
          (longitude)
          float32
          -74.12 -72.12 ... -14.12 -12.12
          units :
          degrees_east
          long_name :
          longitude
          array([-74.125, -72.125, -70.125, -68.125, -66.125, -64.125, -62.125, -60.125,
                 -58.125, -56.125, -54.125, -52.125, -50.125, -48.125, -46.125, -44.125,
                 -42.125, -40.125, -38.125, -36.125, -34.125, -32.125, -30.125, -28.125,
                 -26.125, -24.125, -22.125, -20.125, -18.125, -16.125, -14.125, -12.125],
                dtype=float32)
        • latitude
          (latitude)
          float32
          84.12 82.12 80.12 ... 58.12 56.12
          units :
          degrees_north
          long_name :
          latitude
          array([84.125, 82.125, 80.125, 78.125, 76.125, 74.125, 72.125, 70.125, 68.125,
                 66.125, 64.125, 62.125, 60.125, 58.125, 56.125], dtype=float32)
        • time
          (time)
          datetime64[ns]
          2023-01-01 2023-01-02 2023-01-03
          long_name :
          time
          array(['2023-01-01T00:00:00.000000000', '2023-01-02T00:00:00.000000000',
                 '2023-01-03T00:00:00.000000000'], dtype='datetime64[ns]')
        • t2m
          (time, latitude, longitude)
          float32
          251.2 251.3 251.4 ... nan nan nan
          units :
          K
          long_name :
          2 metre temperature
          array([[[251.22891, 251.29869, 251.40335, ..., 260.6729 , 260.9839 ,
                   261.30545],
                  [254.48108, 254.14888, 253.39651, ..., 260.6001 , 261.38736,
                   263.12418],
                  [251.10605, 257.09616, 257.4405 , ..., 262.84204, 264.92468,
                   267.69144],
                  ...,
                  [259.32593, 258.99222, 264.5925 , ..., 279.24994, 279.41226,
                   279.44562],
                  [264.75024, 263.21518, 265.02023, ..., 279.5063 , 279.43045,
                   279.92648],
                  [264.39075, 264.4029 , 265.45407, ..., 279.8051 , 280.36182,
                   280.79413]],
          
                 [[252.6253 , 252.51997, 252.39021, ..., 262.95435, 263.76956,
                   264.43823],
                  [257.51352, 256.95172, 255.29382, ..., 263.46576, 264.51608,
                   264.9939 ],
                  [256.79144, 260.1042 , 260.16525, ..., 264.15884, 264.58783,
                   266.69608],
          ...
                  [263.2032 , 263.2154 , 263.17572, ...,       nan,       nan,
                         nan],
                  [263.16504, 263.34366, 263.66425, ...,       nan,       nan,
                         nan],
                  [262.9101 , 261.80634, 261.22928, ...,       nan,       nan,
                         nan]],
          
                 [[254.79   , 254.74449, 255.00229, ..., 261.18344, 262.10242,
                   263.11694],
                  [257.67432, 257.63943, 256.4369 , ..., 262.2662 , 263.19125,
                   263.85696],
                  [256.78113, 259.32727, 260.0491 , ..., 263.93887, 264.15118,
                   265.5266 ],
                  ...,
                  [260.24475, 260.38425, 262.69687, ...,       nan,       nan,
                   281.96973],
                  [259.7534 , 260.78006, 262.97894, ...,       nan,       nan,
                         nan],
                  [259.8914 , 260.20227, 261.01813, ...,       nan,       nan,
                         nan]]], dtype=float32)
        • time_mask
          (time)
          bool
          True False False
          array([ True, False, False])
        • longitude
          PandasIndex
          PandasIndex(Index([-74.125, -72.125, -70.125, -68.125, -66.125, -64.125, -62.125, -60.125,
                 -58.125, -56.125, -54.125, -52.125, -50.125, -48.125, -46.125, -44.125,
                 -42.125, -40.125, -38.125, -36.125, -34.125, -32.125, -30.125, -28.125,
                 -26.125, -24.125, -22.125, -20.125, -18.125, -16.125, -14.125, -12.125],
                dtype='float32', name='longitude'))
        • latitude
          PandasIndex
          PandasIndex(Index([84.125, 82.125, 80.125, 78.125, 76.125, 74.125, 72.125, 70.125, 68.125,
                 66.125, 64.125, 62.125, 60.125, 58.125, 56.125],
                dtype='float32', name='latitude'))
        • time
          PandasIndex
          PandasIndex(DatetimeIndex(['2023-01-01', '2023-01-02', '2023-01-03'], dtype='datetime64[ns]', name='time', freq='D'))
      • Conventions :
        CF-1.6
        history :
        2024-04-10 18:52:20 GMT by grib_to_netcdf-2.25.1: /opt/ecmwf/mars-client/bin/grib_to_netcdf.bin -S param -o /cache/data1/adaptor.mars.internal-1712775139.728601-23944-12-bdaa8304-b7e7-4c83-8391-944334f99b6e.nc /cache/tmp/bdaa8304-b7e7-4c83-8391-944334f99b6e-adaptor.mars.internal-1712775136.3671-23944-21-tmp.grib

      7.1 visualize time period finding¶

      In [14]:
      df = tp["time_mask"].to_dataframe().reset_index()
      fig = px.line(df, x="time", y="time_mask")
      fig.update_yaxes(autorange="reversed")
      fig.show()
      

      8. Shape query¶

      In [15]:
      shape_file_path = "../data/geoshape/greenland.geojson"
      gdf_shape = gpd.read_file(shape_file_path)
      gdf_shape.plot()
      
      Out[15]:
      <Axes: >
      No description has been provided for this image
      In [16]:
      sq = shape_query(
          variable=VARIABLE,
          shape_fpath=shape_file_path,
          start_datetime=START_DATETIME,
          end_datetime=END_DATETIME,
      )
      sq
      
      Out[16]:
      <xarray.Dataset> Size: 5MB
      Dimensions:     (time: 58, latitude: 95, longitude: 244)
      Coordinates:
        * longitude   (longitude) float32 976B -73.0 -72.75 -72.5 ... -12.5 -12.25
        * latitude    (latitude) float32 380B 83.5 83.25 83.0 ... 60.5 60.25 60.0
        * time        (time) datetime64[ns] 464B 2023-01-01 ... 2023-01-03T09:00:00
      Data variables:
          t2m         (time, latitude, longitude) float32 5MB 248.7 248.8 ... 281.8
          shape_mask  (latitude, longitude) bool 23kB False False ... False False
      Attributes:
          Conventions:  CF-1.6
          history:      2024-04-10 18:52:20 GMT by grib_to_netcdf-2.25.1: /opt/ecmw...
      xarray.Dataset
        • time: 58
        • latitude: 95
        • longitude: 244
        • longitude
          (longitude)
          float32
          -73.0 -72.75 -72.5 ... -12.5 -12.25
          units :
          degrees_east
          long_name :
          longitude
          array([-73.  , -72.75, -72.5 , ..., -12.75, -12.5 , -12.25], dtype=float32)
        • latitude
          (latitude)
          float32
          83.5 83.25 83.0 ... 60.5 60.25 60.0
          units :
          degrees_north
          long_name :
          latitude
          array([83.5 , 83.25, 83.  , 82.75, 82.5 , 82.25, 82.  , 81.75, 81.5 , 81.25,
                 81.  , 80.75, 80.5 , 80.25, 80.  , 79.75, 79.5 , 79.25, 79.  , 78.75,
                 78.5 , 78.25, 78.  , 77.75, 77.5 , 77.25, 77.  , 76.75, 76.5 , 76.25,
                 76.  , 75.75, 75.5 , 75.25, 75.  , 74.75, 74.5 , 74.25, 74.  , 73.75,
                 73.5 , 73.25, 73.  , 72.75, 72.5 , 72.25, 72.  , 71.75, 71.5 , 71.25,
                 71.  , 70.75, 70.5 , 70.25, 70.  , 69.75, 69.5 , 69.25, 69.  , 68.75,
                 68.5 , 68.25, 68.  , 67.75, 67.5 , 67.25, 67.  , 66.75, 66.5 , 66.25,
                 66.  , 65.75, 65.5 , 65.25, 65.  , 64.75, 64.5 , 64.25, 64.  , 63.75,
                 63.5 , 63.25, 63.  , 62.75, 62.5 , 62.25, 62.  , 61.75, 61.5 , 61.25,
                 61.  , 60.75, 60.5 , 60.25, 60.  ], dtype=float32)
        • time
          (time)
          datetime64[ns]
          2023-01-01 ... 2023-01-03T09:00:00
          long_name :
          time
          array(['2023-01-01T00:00:00.000000000', '2023-01-01T01:00:00.000000000',
                 '2023-01-01T02:00:00.000000000', '2023-01-01T03:00:00.000000000',
                 '2023-01-01T04:00:00.000000000', '2023-01-01T05:00:00.000000000',
                 '2023-01-01T06:00:00.000000000', '2023-01-01T07:00:00.000000000',
                 '2023-01-01T08:00:00.000000000', '2023-01-01T09:00:00.000000000',
                 '2023-01-01T10:00:00.000000000', '2023-01-01T11:00:00.000000000',
                 '2023-01-01T12:00:00.000000000', '2023-01-01T13:00:00.000000000',
                 '2023-01-01T14:00:00.000000000', '2023-01-01T15:00:00.000000000',
                 '2023-01-01T16:00:00.000000000', '2023-01-01T17:00:00.000000000',
                 '2023-01-01T18:00:00.000000000', '2023-01-01T19:00:00.000000000',
                 '2023-01-01T20:00:00.000000000', '2023-01-01T21:00:00.000000000',
                 '2023-01-01T22:00:00.000000000', '2023-01-01T23:00:00.000000000',
                 '2023-01-02T00:00:00.000000000', '2023-01-02T01:00:00.000000000',
                 '2023-01-02T02:00:00.000000000', '2023-01-02T03:00:00.000000000',
                 '2023-01-02T04:00:00.000000000', '2023-01-02T05:00:00.000000000',
                 '2023-01-02T06:00:00.000000000', '2023-01-02T07:00:00.000000000',
                 '2023-01-02T08:00:00.000000000', '2023-01-02T09:00:00.000000000',
                 '2023-01-02T10:00:00.000000000', '2023-01-02T11:00:00.000000000',
                 '2023-01-02T12:00:00.000000000', '2023-01-02T13:00:00.000000000',
                 '2023-01-02T14:00:00.000000000', '2023-01-02T15:00:00.000000000',
                 '2023-01-02T16:00:00.000000000', '2023-01-02T17:00:00.000000000',
                 '2023-01-02T18:00:00.000000000', '2023-01-02T19:00:00.000000000',
                 '2023-01-02T20:00:00.000000000', '2023-01-02T21:00:00.000000000',
                 '2023-01-02T22:00:00.000000000', '2023-01-02T23:00:00.000000000',
                 '2023-01-03T00:00:00.000000000', '2023-01-03T01:00:00.000000000',
                 '2023-01-03T02:00:00.000000000', '2023-01-03T03:00:00.000000000',
                 '2023-01-03T04:00:00.000000000', '2023-01-03T05:00:00.000000000',
                 '2023-01-03T06:00:00.000000000', '2023-01-03T07:00:00.000000000',
                 '2023-01-03T08:00:00.000000000', '2023-01-03T09:00:00.000000000'],
                dtype='datetime64[ns]')
        • t2m
          (time, latitude, longitude)
          float32
          248.7 248.8 248.8 ... 281.7 281.8
          units :
          K
          long_name :
          2 metre temperature
          array([[[248.73216, 248.77917, 248.8444 , ..., 259.24252, 259.43362,
                   259.6202 ],
                  [248.20277, 248.26952, 248.30441, ..., 258.66458, 258.85724,
                   259.04987],
                  [246.81029, 246.74203, 246.67378, ..., 257.7939 , 258.1443 ,
                   258.49622],
                  ...,
                  [249.91077, 249.66655, 250.18987, ..., 279.0634 , 279.01788,
                   278.99512],
                  [253.19629, 253.21753, 253.2782 , ..., 279.08612, 278.99814,
                   278.87073],
                  [256.26187, 256.22546, 256.18604, ..., 279.10583, 278.86316,
                   278.62805]],
          
                 [[248.76704, 248.74733, 248.7443 , ..., 259.85837, 259.97668,
                   260.08286],
                  [248.15727, 248.15424, 248.11024, ..., 259.45486, 259.5656 ,
                   259.67786],
                  [246.11708, 245.9381 , 245.75911, ..., 258.65247, 258.95126,
                   259.25162],
          ...
                  [255.19034, 254.84912, 254.48215, ..., 281.61032, 281.67856,
                   281.7635 ],
                  [256.07898, 255.78024, 255.46481, ..., 281.68463, 281.7256 ,
                   281.75134],
                  [257.2497 , 256.89334, 256.54758, ..., 281.812  , 281.79077,
                   281.77258]],
          
                 [[253.47672, 253.42668, 253.37512, ..., 262.0372 , 262.1631 ,
                   262.28592],
                  [251.65695, 251.60388, 251.53412, ..., 262.36627, 262.49518,
                   262.62408],
                  [249.38528, 249.23817, 249.09108, ..., 262.5695 , 262.71356,
                   262.85764],
                  ...,
                  [255.37686, 255.0493 , 254.699  , ..., 281.69525, 281.68616,
                   281.66037],
                  [256.31708, 256.03955, 255.73323, ..., 281.69827, 281.7089 ,
                   281.721  ],
                  [257.45593, 257.21786, 256.97675, ..., 281.73163, 281.74225,
                   281.7544 ]]], dtype=float32)
        • shape_mask
          (latitude, longitude)
          bool
          False False False ... False False
          array([[False, False, False, ..., False, False, False],
                 [False, False, False, ..., False, False, False],
                 [False, False, False, ..., False, False, False],
                 ...,
                 [False, False, False, ..., False, False, False],
                 [False, False, False, ..., False, False, False],
                 [False, False, False, ..., False, False, False]])
        • longitude
          PandasIndex
          PandasIndex(Index([ -73.0, -72.75,  -72.5, -72.25,  -72.0, -71.75,  -71.5, -71.25,  -71.0,
                 -70.75,
                 ...
                  -14.5, -14.25,  -14.0, -13.75,  -13.5, -13.25,  -13.0, -12.75,  -12.5,
                 -12.25],
                dtype='float32', name='longitude', length=244))
        • latitude
          PandasIndex
          PandasIndex(Index([ 83.5, 83.25,  83.0, 82.75,  82.5, 82.25,  82.0, 81.75,  81.5, 81.25,
                  81.0, 80.75,  80.5, 80.25,  80.0, 79.75,  79.5, 79.25,  79.0, 78.75,
                  78.5, 78.25,  78.0, 77.75,  77.5, 77.25,  77.0, 76.75,  76.5, 76.25,
                  76.0, 75.75,  75.5, 75.25,  75.0, 74.75,  74.5, 74.25,  74.0, 73.75,
                  73.5, 73.25,  73.0, 72.75,  72.5, 72.25,  72.0, 71.75,  71.5, 71.25,
                  71.0, 70.75,  70.5, 70.25,  70.0, 69.75,  69.5, 69.25,  69.0, 68.75,
                  68.5, 68.25,  68.0, 67.75,  67.5, 67.25,  67.0, 66.75,  66.5, 66.25,
                  66.0, 65.75,  65.5, 65.25,  65.0, 64.75,  64.5, 64.25,  64.0, 63.75,
                  63.5, 63.25,  63.0, 62.75,  62.5, 62.25,  62.0, 61.75,  61.5, 61.25,
                  61.0, 60.75,  60.5, 60.25,  60.0],
                dtype='float32', name='latitude'))
        • time
          PandasIndex
          PandasIndex(DatetimeIndex(['2023-01-01 00:00:00', '2023-01-01 01:00:00',
                         '2023-01-01 02:00:00', '2023-01-01 03:00:00',
                         '2023-01-01 04:00:00', '2023-01-01 05:00:00',
                         '2023-01-01 06:00:00', '2023-01-01 07:00:00',
                         '2023-01-01 08:00:00', '2023-01-01 09:00:00',
                         '2023-01-01 10:00:00', '2023-01-01 11:00:00',
                         '2023-01-01 12:00:00', '2023-01-01 13:00:00',
                         '2023-01-01 14:00:00', '2023-01-01 15:00:00',
                         '2023-01-01 16:00:00', '2023-01-01 17:00:00',
                         '2023-01-01 18:00:00', '2023-01-01 19:00:00',
                         '2023-01-01 20:00:00', '2023-01-01 21:00:00',
                         '2023-01-01 22:00:00', '2023-01-01 23:00:00',
                         '2023-01-02 00:00:00', '2023-01-02 01:00:00',
                         '2023-01-02 02:00:00', '2023-01-02 03:00:00',
                         '2023-01-02 04:00:00', '2023-01-02 05:00:00',
                         '2023-01-02 06:00:00', '2023-01-02 07:00:00',
                         '2023-01-02 08:00:00', '2023-01-02 09:00:00',
                         '2023-01-02 10:00:00', '2023-01-02 11:00:00',
                         '2023-01-02 12:00:00', '2023-01-02 13:00:00',
                         '2023-01-02 14:00:00', '2023-01-02 15:00:00',
                         '2023-01-02 16:00:00', '2023-01-02 17:00:00',
                         '2023-01-02 18:00:00', '2023-01-02 19:00:00',
                         '2023-01-02 20:00:00', '2023-01-02 21:00:00',
                         '2023-01-02 22:00:00', '2023-01-02 23:00:00',
                         '2023-01-03 00:00:00', '2023-01-03 01:00:00',
                         '2023-01-03 02:00:00', '2023-01-03 03:00:00',
                         '2023-01-03 04:00:00', '2023-01-03 05:00:00',
                         '2023-01-03 06:00:00', '2023-01-03 07:00:00',
                         '2023-01-03 08:00:00', '2023-01-03 09:00:00'],
                        dtype='datetime64[ns]', name='time', freq=None))
      • Conventions :
        CF-1.6
        history :
        2024-04-10 18:52:20 GMT by grib_to_netcdf-2.25.1: /opt/ecmwf/mars-client/bin/grib_to_netcdf.bin -S param -o /cache/data1/adaptor.mars.internal-1712775139.728601-23944-12-bdaa8304-b7e7-4c83-8391-944334f99b6e.nc /cache/tmp/bdaa8304-b7e7-4c83-8391-944334f99b6e-adaptor.mars.internal-1712775136.3671-23944-21-tmp.grib

      8.1 visualize shape query¶

      In [17]:
      # mask data
      masked = sq["t2m"].where(sq["shape_mask"])
      
      In [18]:
      # visualize the mask
      sq["shape_mask"].plot()
      
      Out[18]:
      <matplotlib.collections.QuadMesh at 0x13cc2ab10>
      No description has been provided for this image
      In [19]:
      # visualize a layer
      masked[0].plot()
      
      Out[19]:
      <matplotlib.collections.QuadMesh at 0x133c8ffd0>
      No description has been provided for this image
      In [20]:
      # visualize all layers
      
      gv_dataset = gv.Dataset(masked)
      gv_dataset.to(gv.Image)
      gv_image = gv_dataset.to(gv.Image)
      gv_image.opts(cmap="coolwarm", colorbar=True, tools=["hover"])
      gv_image = gv_image * gf.coastline
      gv_image.opts(width=700, height=500)
      
      Out[20]:
      In [ ]: